package library.frame;

import library.logic.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.sql.SQLException;

/**
 * User: RockCrazy
 * Date: 09.12.11
 * Time: 16:02
 */
public class MainFrame extends JFrame implements ActionListener
{
	// Параметры окна
	private static final int D_HEIGHT = 600;   // высота окна
	private final static int D_WIDTH = 800;   // ширина окна

	private ManagementSystem ms = null;

	private static final String SHOW_ADD_BOOK = "showAddBook";
	private static final String SHOW_EDIT_BOOK = "showEditBook";
	private static final String SHOW_ADD_READER = "showAddReader";
	private static final String SHOW_EDIT_READER = "showEditReader";
	private static final String SHOW_ADD_JOURNAL = "showAddJournal";
	private static final String SHOW_EDIT_JOURNAL = "showEditJournal";
	private static final String SHOW_FIND_READER = "showFindReader";
	private static final String SHOW_FIND_BOOK = "showFindBook";
	private static final String SHOW_ADD_TEMA = "showAddTema";
	private static final String SHOW_EDIT_TEMA = "showEditTema";
	private static final String SHOW_ADD_POST = "showAddPost";
	private static final String SHOW_EDIT_POST = "showEditPost";
	private static final String SHOW_ABOUT = "showAbout";
	private static final String SHOW_HELP = "showHelp";



	/**
	 * основная форма
	 * @param s
	 * @throws Exception
	 */
	public MainFrame(String s) throws Exception
	{
		ms = ManagementSystem.getInstance();
		setTitle("Библиотека \"Книголюб\"");

		/*Основной контейнер*/

		Container c = getContentPane();
		// Создаем layout для всей клиентской части
		c.setLayout(new BorderLayout());

//****  MENU  begin ****//

		// Создаем строку меню
		JMenuBar menuBar = new JMenuBar();

		// I пункт меню "Книга"
		JMenu book = new JMenu("Книга");
		//book.setMnemonic('К');
		JMenuItem newBook = new JMenuItem("Новая книга");
		//newBook.setMnemonic('N');
		newBook.setName(SHOW_ADD_BOOK);
		newBook.addActionListener(this);
		book.add(newBook);
		// Подпункт Редактирование книги
		JMenuItem editBook = new JMenuItem("Редактирование книги");
		//editBook.setMnemonic('К');
		editBook.setName(SHOW_EDIT_BOOK);
		editBook.addActionListener(this);
		book.add(editBook);

		// II пункт "Читатель"
		JMenu reader = new JMenu("Читатель");
		//reader.setMnemonic('Ч');
		// Подпункт Новый читатель
		JMenuItem newReader = new JMenuItem("Новый читатель");
		//newReader.setMnemonic('Н');
		newReader.setName(SHOW_ADD_READER);
		newReader.addActionListener(this);
		reader.add(newReader);
		// Подпункт Редактирование читателей
		JMenuItem editReader = new JMenuItem("Редактирование читателей");
		//editReader.setMnemonic('Е');
		editReader.setName(SHOW_EDIT_READER);
		editReader.addActionListener(this);
		reader.add(editReader);

		// III пункт "Журнал"
		JMenu journal = new JMenu("Журнал");
		// Подпункт Редактирование читателей
		JMenuItem journalAdd = new JMenuItem("Новая запись");
		journalAdd.setName(SHOW_ADD_JOURNAL);
		journalAdd.addActionListener(this);
		journal.add(journalAdd);

		JMenuItem journalEdit = new JMenuItem("Редактировать");
		journalEdit.setName(SHOW_EDIT_JOURNAL);
		journalEdit.addActionListener(this);
		journal.add(journalEdit);

		// IV пункт "Поиск"
		JMenu find = new JMenu("Поиск");
		JMenuItem findReader = new JMenuItem("Поиск Читателя");
		findReader.setName(SHOW_FIND_READER);
		findReader.addActionListener(this);

		JMenuItem findBook = new JMenuItem("Поиск Книги");
		findBook.setName(SHOW_FIND_BOOK);
		findBook.addActionListener(this);

		find.add(findReader);
		find.add(findBook);

		// V пункт "Печать"
		//JMenu print = new JMenu("Печать");
		//print.setMnemonic('Р');

		// VI пункт "Справочник"
		JMenu info = new JMenu("Справочник");

		// Подпункт
		JMenu infoReader = new JMenu("Читатели");
		// Создаем 2 суб пункт меню Cправочники
		JMenuItem subInfoReaderAdd = new JMenuItem("Добавить");
		subInfoReaderAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK));
		// Добавляем листенер
		subInfoReaderAdd.setName(SHOW_ADD_READER);
		subInfoReaderAdd.addActionListener(this);

		JMenuItem subInfoReaderEdit = new JMenuItem("Править");
		subInfoReaderEdit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.ALT_MASK));
		// Добавляем листенер
		subInfoReaderEdit.setName(SHOW_EDIT_READER);
		subInfoReaderEdit.addActionListener(this);

		// Вставляем суб пункт меню в Читатели
		infoReader.add(subInfoReaderAdd);
		infoReader.add(subInfoReaderEdit);

		// Подпункт Темы
		JMenu infoTema = new JMenu("Темы");
		// Создаем 1 суб пункт меню Cправочники
		JMenuItem subInfoTemaAdd = new JMenuItem("Добавить");
		subInfoTemaAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, ActionEvent.ALT_MASK));
		// Добавляем листенер
		subInfoTemaAdd.setName(SHOW_ADD_TEMA);
		subInfoTemaAdd.addActionListener(this);
		// Создаем 2 суб пункт меню Cправочники
		JMenuItem subInfoTemaEdit = new JMenuItem("Править");
		subInfoTemaEdit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
		// Добавляем листенер
		subInfoTemaEdit.setName(SHOW_EDIT_TEMA);
		subInfoTemaEdit.addActionListener(this);
		// Вставляем суб пункт меню в Темы
		infoTema.add(subInfoTemaAdd);
		infoTema.add(subInfoTemaEdit);

		// Подпункт Издатель
		JMenu infoPost = new JMenu("Издатели");
		// Создаем 1 суб пункт меню Cправочники
		JMenuItem subInfoPostAdd = new JMenuItem("Добавить");
		subInfoPostAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, ActionEvent.ALT_MASK));
		// Добавляем листенер
		subInfoPostAdd.setName(SHOW_ADD_POST);
		subInfoPostAdd.addActionListener(this);
		// Создаем 3 суб пункт меню Cправочники
		JMenuItem subInfoPostEdit = new JMenuItem("Править");
		subInfoPostEdit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.ALT_MASK));
		// Добавляем листенер
		subInfoPostEdit.setName(SHOW_EDIT_POST);
		subInfoPostEdit.addActionListener(this);
		// Вставляем суб пункт меню в Издатели
		infoPost.add(subInfoPostAdd);
		infoPost.add(subInfoPostEdit);
		// Добавляем подпункты в Справочник
		info.add(infoReader);
		info.add(infoTema);
		info.add(infoPost);

		//info.add();

		// VII пункт "Справка"
		JMenu help = new JMenu("Справка");
		//help.setMnemonic('H');
		// Подпункт Помощь
		JMenuItem helpHelp = new JMenuItem("Помощь");
		helpHelp.setName(SHOW_HELP);
		helpHelp.addActionListener(this);
		help.add(helpHelp);
		// Подпункт About
		JMenuItem helpAbout = new JMenuItem("О программе");
		helpAbout.setMnemonic('A');
		helpAbout.setName(SHOW_ABOUT);
		helpAbout.addActionListener(this);
		help.add(helpAbout);


		// Устанавливаем меню для формы
		setJMenuBar(menuBar);
		menuBar.add(book);
		menuBar.add(reader);
		menuBar.add(journal);
		menuBar.add(find);
		//menuBar.add(print);
		menuBar.add(info);
		menuBar.add(help);

//****  MENU  end  ****//


		// Устанавливаем левую панель
		JPanel lefPanel = new JPanel();
		// Добавляем в общий контейнер botPanel (в низ)
		c.add(lefPanel, BorderLayout.WEST);

		// Устанавливаем правую панель
		JPanel rightPanel = new JPanel();
		// Добавляем в общий контейнер botPanel (в низ)
		c.add(rightPanel, BorderLayout.EAST);

		// Получаем размеры экрана
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		setBounds(((int) d.getWidth() - this.D_WIDTH) / 2, ((int) d.getHeight() - this.D_HEIGHT) / 2,
				this.D_WIDTH, this.D_HEIGHT);
	}

	public static void main(String args[])
	{
		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{
				try
				{
					// сразу отменим продолжение работы, если не сможем получить
					// коннект к базе данных
					MainFrame mf = new MainFrame("Library");
					mf.setDefaultCloseOperation(EXIT_ON_CLOSE);
					Config.load();
					mf.setVisible(true);
				} catch (Exception ex)
				{
					ex.printStackTrace();
				}

			}
		});
	}

	/**
	 * Исполнитель "желаний"
	 * @param actionEvent
	 */
	public void actionPerformed(ActionEvent actionEvent)
	{
		if (actionEvent.getSource() instanceof Component);
		{
			Component c = (Component) actionEvent.getSource();

			if (c.getName().equals(SHOW_ADD_BOOK))
			{
				showAddBook();      // Выводим окно для добавления книги
			}

			if (c.getName().equals(SHOW_EDIT_BOOK))
			{
				showBook();       // Выводим окно с данными о книгах
			}

			if (c.getName().equals(SHOW_ADD_READER))
			{
				showAddReader();    // Выводим окно для внесения нового читателя
			}

			if (c.getName().equals(SHOW_EDIT_READER))
			{
				showReader();       // Выводим окно с данными о читателях
			}

			if (c.getName().equals(SHOW_ADD_JOURNAL))
			{
				showAddJournal();       // Выводим окно с данными о читателях
			}
			if (c.getName().equals(SHOW_EDIT_JOURNAL))
			{
				showEditJournal();       // Выводим окно с данными о читателях
			}

			if (c.getName().equals(SHOW_ADD_TEMA))
			{
				showAddTema();         // Выводим окно для добавления новой темы
			}

			if (c.getName().equals(SHOW_FIND_READER))
			{
				showFindReader();         // Выводим окно для поиска читателя
			}

			if (c.getName().equals(SHOW_FIND_BOOK))
			{
				showFindBook();         // Выводим окно для поиска читателя
			}

			if (c.getName().equals(SHOW_EDIT_TEMA))
			{
				showEditTema();         // Выводим окно для редактировыания данных темы
			}

			if (c.getName().equals(SHOW_ADD_POST))
			{
				showAddPost();         // Выводим окно для добавления нового издательства
			}

			if (c.getName().equals(SHOW_EDIT_POST))
			{
				showEditPost();         // Выводим окно для редактирования данных Идздательства
			}

			if (c.getName().equals(SHOW_HELP))
			{
				showHelp();         // Выводим Help в формате HTML
			}
			if (c.getName().equals(SHOW_ABOUT))
			{
				showAbout();        // Вывод "О программе"
			}
		}
	}

	private void showEditJournal()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				WinJournal winJournal = null;
				try
				{
					winJournal = new WinJournal(ms.getReaders(), ms.getBooks(), false, MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				winJournal.setVisible(true);
			}
		};
		t.start();
	}

	private void showAddJournal()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				try
				{
					WinJournal winJournal = new WinJournal(ms.getReaders(), ms.getBooks(), true, MainFrame.this);
					winJournal.setModal(true);
					winJournal.setVisible(true);
					if (winJournal.getResult())
					{
						Journal journal = winJournal.getJournal();
						ms.insertJournal(journal);
						winJournal.reloadJournal();
					}
				}
				catch (SQLException e)
				{
					JOptionPane.showMessageDialog(MainFrame.this, e.getMessage());
				}

			}
		};
		t.start();
	}

	/**
	 * Окно Поиск книги
	 */
	private void showFindBook()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				// Выводим данные для поиска книги
				WinFindBook wfBook = null;
				try
				{
					wfBook = new WinFindBook(MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				wfBook.setVisible(true);
			}
		};
		t.start();
	}

	/**
	 * Окно Поиск Читателя
	 */
	private void showFindReader()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				// Выводим данные для поиска читателя
				WinFindReader wfReader = null;
				try
				{
					wfReader = new WinFindReader(MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				wfReader.setVisible(true);
			}
		};
		t.start();
	}

	/**
	 * Окно редактирования Издательства
	 */
	private void showEditPost()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				// Исправляем данные издательства - поэтому false
				// Также заметим, что необходимо указать не просто this, а DBMainFrame.this
				// Иначе класс не будет воспринят - он же другой - анонимный
				WinPost winPost = null;
				try
				{
					winPost = new WinPost(false, MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				winPost.setVisible(true);
			}
		};
		t.start();
	}

	private void showAddPost()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				try
				{
					// Добавляем новой темы, поэтому параметр - true
					// Также заметим, что необходимо указать не просто this, а DBMainFrame.this
					// Иначе класс не будет воспринят - он же другой - анонимный
					WinPost winPost = new WinPost(true, MainFrame.this);
					winPost.setModal(true);
					winPost.setVisible(true);
					if (winPost.getResult())
					{
						Post post = winPost.getPost();
						ms.insertPost(post);
						winPost.reloadPosts();
					}
				}
				catch (SQLException e)
				{
					JOptionPane.showMessageDialog(MainFrame.this, e.getMessage());
				}
			}
		};
		t.start();
	}

	/**
	 *  Окно редактирования Темы
	 */
	private void showEditTema()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				WinTema winTema = null;
				try
				{
					winTema = new WinTema(false, MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				winTema.setVisible(true);
			}
		};
		t.start();
	}

	/**
	 * Окно Добавления Темы
	 */
	private void showAddTema()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				try
				{
					// Добавляем новой темы, поэтому параметр - true
					// Также заметим, что необходимо указать не просто this, а DBMainFrame.this
					// Иначе класс не будет воспринят - он же другой - анонимный
					WinTema winTema = new WinTema(true, MainFrame.this);
					winTema.setModal(true);
					winTema.setVisible(true);
					if (winTema.getResult())
					{
						Tema tema = winTema.getTema();
						ms.insertTema(tema);
						winTema.reloadTemas();
					}
				}
				catch (SQLException e)
				{
					JOptionPane.showMessageDialog(MainFrame.this, e.getMessage());
				}
			}
		};
		t.start();
	}

	private void showBook()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				// Исправляем данные книги - поэтому false
				// Также заметим, что необходимо указать не просто this, а DBMainFrame.this
				// Иначе класс не будет воспринят - он же другой - анонимный
				WinBook winBook = null;
				try
				{
					winBook = new WinBook(ms.getTems() ,false, MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				winBook.setVisible(true);
			}
		};
		t.start();
	}


	private void showAddBook()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				try
				{
					// Добавляем нового читателя, поэтому параметр - true
					// Также заметим, что необходимо указать не просто this, а DBMainFrame.this
					// Иначе класс не будет воспринят - он же другой - анонимный
					WinBook winBook = new WinBook(ms.getTems(),true, MainFrame.this);
					winBook.setModal(true);
					winBook.setVisible(true);
					if (winBook.getResult())
					{
						Book book = winBook.getBook();
						ms.insertBook(book);
						winBook.reloadBooks();
					}
				}
				catch (SQLException e)
				{
					JOptionPane.showMessageDialog(MainFrame.this, e.getMessage());
				}
			}
		};
		t.start();
	}

	/**
	 * Выводим Help в формате HTML
	 */
	private void showHelp()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				Help wHelp = null;
				try
				{
					wHelp = new Help();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				wHelp.setVisible(true);
			}
		};
		t.start();
	}

	/**
	 * Выводим окно с данными о читателях
	 */
	private void showReader()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				// Исправляем данные читателя - поэтому false
				// Также заметим, что необходимо указать не просто this, а DBMainFrame.this
				// Иначе класс не будет воспринят - он же другой - анонимный
				WinReader winReader = null;
				try
				{
					winReader = new WinReader(false, MainFrame.this);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
				winReader.setVisible(true);
			}
		};
		t.start();
	}

	/**
	 * Выводим окно для внесения нового читателя
	 */
	private void showAddReader()
	{
		Thread t = new Thread()
		{
			public void run()
			{
		    	try
				{
		            WinReader winReder = new WinReader( true, MainFrame.this);
					winReder.setModal(true);
					winReder.setVisible(true);
		            if (winReder.getResult())
					{
		            	Reader rdr = winReder.getReader();
		                ms.insertReader(rdr);
						winReder.reloadReaders();
		            }
		        }
			    catch (SQLException e)
				{
		        	JOptionPane.showMessageDialog(MainFrame.this, e.getMessage());
		        }
		    }
		};
		t.start();
	}

	/**
	 * Вывод "О программе"
	 */
	private void showAbout()
	{
		Thread t = new Thread()
		{
			public void run()
			{
				WinAbout wAbout = null;
				try
				{
					wAbout = new WinAbout();
				}
				catch (Exception e)
				{
					JOptionPane.showMessageDialog(MainFrame.this, e.getMessage());
				}
				wAbout.setVisible(true);
			}
		};
		t.start();
	}


}
